const puppeteer=require('puppeteer');
let request=require('request-promise-native');
const fs = require('fs');
const axios=require('axios');
const moment = require('moment');
const now = moment().format('YYYYMMDD');


// 使用puppeteer.launch启动Chrome
async function main(){
  const bro=await puppeteer.launch({//代表浏览器
    headless:false,    // 有浏览器界面启动
    slowMo:150,      // 放慢浏览器执行速度，方便测试观察
    args:[
      '-no-sandbox',
      '--window-size=1366,768'
    ],
  });
  const page=await bro.newPage();//创建新窗口 新页面
  page.setViewport({width: 1366, height: 768})
  //跳转页面
  await page.goto('https://www.youku.com/category/show/c_100.html?spm=a2hcb.12701310.app.5~5!2~5!2~5~5~DL~DD~A!4&theme=dark');

 var min = 0,max =15
 let total = 1050//1021 优酷 没有显示确切总数量 所以 这里自己写个数 可以通过日志中的空数组来猜测大概数目
 return new Promise((resolve, reject)=>{
	 async function forFunction(){
	 		 
	 		extractData(page,min,max,total)  //抓取数据
	 		console.log(`调用extractData:min是：${min},max是：${max}`)
	 		if(max<total){//
	 			min +=15
	 			max +=15
	 			await page.keyboard.down('PageDown');
	 			await page.keyboard.down('PageDown');
	 			await page.keyboard.down('PageDown');
	 			setTimeout(function(){
	 				forFunction()
	 			},1000)//因为优酷有访问次数限制 所以不能太快
	 			
	 		}else{
	 			console.log('任务完成 2秒后关闭')
	 			resolve({status:200,msg:'抓取完成'})
	 			setTimeout(function(){
	 				close()
	 			},2000)
	 			//没有下一页时关闭页面 关闭浏览器
	 		}
	  }
	  // 执行任务
	  forFunction()
	  
	 async function close(){
	  		await page.close();
	  		await bro.close();	  
	  }
	 
 })
	   // extractData(page,1,10) //测试时可以直接使用这里 注释掉 上面部分 

};	


async function extractData(page,_min,_max,_total){
	console.log(`开始提取数据...`)
var data = await page.evaluate((min,max,total) => {
			 let result =[] //结果集
			if(max>total){
				max = total
			}
			for(let i = min;i<max;i++){
				//使用原生js 提取数据
				let $el = document.querySelector('.videolist_container_inner').childNodes[i]// 要找到的目标元素li
				if(!$el){continue}
				let exclusive = $el.querySelector('.categorypack_pack_tag')
				if(exclusive){exclusive = exclusive.innerHTML}else{exclusive = ''}
				result.push({
					title: $el.querySelector('.categorypack_title a').innerHTML,//标题
					titleLink: 'https:' + $el.querySelector('.categorypack_title a').getAttribute('href'),//链接
					imgUrl: 'https:' + $el.querySelector('.categorypack_pack_cover img').getAttribute('src')+'.jpg',//图片地址
					exclusive:exclusive,//$el.querySelector('.categorypack_pack_tag').innerHTML,//会员或者独家
					episode:$el.querySelector('.categorypack_p_rb span').innerHTML,//更新到多少话了
					synopsis:$el.querySelector('.categorypack_subtitle').innerHTML//简介
				});
			} 
			  // 返回数据
			  return result
			  
	   },_min,_max,_total)
	  // console.log(data)
	  //写数据 与 上传
	 writeFile(data)
}

//写入文件
async function writeFile(data){
	console.log('开始保存提交数据...')
	
	let upData = {
		action:'youku',
		data:data
	}
	axios.post('https://ff5f406c-368c-4527-9a5a-3e83eab9e589.bspapp.com/http/collector', upData).then(res => {
		  console.log(res.data)
	}).catch(error => {
		console.log(error) 
	})   //查询失败返回的值
	
	let formatData = JSON.stringify(data,null, 4);//格式化数据
	fs.writeFile(`./log/youku${now}.json`, formatData, {'encoding':'utf8','flag':'a'}, (err) => {//flag:a 累加写入 w 清空写入
	    if (err){
			console.log(err)  
		  } 
	    console.log('已写入json');
	});
	
	
}



// main()
module.exports =  {main}